#include <iostream>
#include <string>
#include <vector>
#include <sw/redis++/redis.h>
#include <chrono>
#include <thread>
using std::cin;
using std::cout;
using std::endl;
using std::iostream;
using std::string;
using std::vector;

using namespace sw::redis;

template <class T>
void print(T &arr)
{

    for (auto it : arr)
    {
        cout << it << endl;
    }
}
template <class T>
void printoptional(const T &t)
{

    for (auto const &x : t)
    {

        if (x.has_value())
        {
            cout << x.value() << endl;
        }
    }
}

void test_nx_xx(Redis &redis)
{

    redis.flushall();
    auto ok1 = redis.set("key1", "val1", std::chrono::seconds(0), sw::redis::UpdateType::NOT_EXIST);
    if (redis.get("key1").has_value())
        cout << ok1 << " :" << redis.get("key1").value() << endl;
    auto ok2 = redis.set("key1", "vals", std::chrono::seconds(0), sw::redis::UpdateType::EXIST);
    if (redis.get("key1").has_value())
        cout << ok2 << " :" << redis.get("key1").value() << endl;
}

void test_expire_ttl(Redis &redis)
{
    using namespace std::chrono_literals;
    redis.flushall();
    auto ok1 = redis.set("key1", "val1", std::chrono::seconds(9), sw::redis::UpdateType::NOT_EXIST);
    // redis.expire("key1",2ms);
    std::this_thread::sleep_for(2s);
    cout << "剩余时间： " << redis.ttl("key1") << endl;
}

void test_mset_mmget(Redis &redis)
{
    redis.flushall();
    // redis.mset({{"key1", "val1"},{"key2","val2"}}); 编译无法识别
    // 或者也可以搞个容器，传进去：
    redis.mset({std::make_pair("key1", "val1"), std::make_pair("key2", "val2")});

    vector<sw::redis::OptionalString> v;
    auto bt = std::back_inserter(v);
    redis.mget({"key1", "key2", "key3"}, bt);
    printoptional(v);
}

void test_inct_decr(Redis &redis)
{

    redis.flushall();
    auto ok1 = redis.set("key1", "2");
    cout << redis.get("key1").value() << endl;
    redis.incr("key1");
    cout << redis.get("key1").value() << endl;
    redis.decr("key1");
    cout << redis.get("key1").value() << endl;
}

void test_getrange_setrange(Redis&redis){
    redis.flushall();

   redis.setrange("key1",2,"2222");
  cout<< redis.getrange("key1",1,10)<<endl;
}
int main()
{

    Redis redis("tcp://127.0.0.1:6379");
    redis.command("select", 6);

    // test_expire_ttl(redis);
    //test_nx_xx(redis);
    //test_mset_mmget(redis);
    //test_mset_mmget(redis);
    //test_inct_decr(redis);
    test_getrange_setrange(redis);
    return 0;
}